/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package utilitarios;

import java.io.*;

// Classe para copiar arquivos
public class Copiador {

   private byte[] buffer;
  
   // Intancia um copiador com um buffer de determinado tamanho
   public Copiador(int tamanhoBuffer) {
      if (tamanhoBuffer < 1) {
         throw new IllegalArgumentException("O tamanho do buffer precisa ser maior que zero!");
      }
      buffer = new byte[tamanhoBuffer];
   }

   // Copia o arquivo de origem para o arquivo de destino
   public void copiaArquivo(File origem, File destino) throws IOException {
      if (origem.isDirectory() || destino.isDirectory()) {
         throw new IllegalArgumentException("Tanto a origem quanto o destino precisam ser arquivos!");
      }

      InputStream entrada = new FileInputStream(origem);
      OutputStream saida = new FileOutputStream(destino);

      int maximo = buffer.length;
      int lidos = -1;
      while ((lidos = entrada.read(buffer, 0, maximo)) != -1) {
         saida.write(buffer, 0, lidos);
      }
      saida.flush();
      entrada.close();
      saida.close();
   }

   // Copia o diretório de origem para o diretório de destino
   public void copiaDiretorio(File origem, File destino) throws IOException {
      copiaDiretorio(origem, destino, null);
   }

   // Copia o diretório de origem para o diretório de destino utilizando um
   // filtro de arquivos para o diretório de origem
   public void copiaDiretorio(File origem, File destino, FileFilter filtro)
         throws IOException {
      if (origem.isFile()) {
         throw new IllegalArgumentException("A origem precisa ser um diretório!");
      }
      if (destino.isFile()) {
         throw new IllegalArgumentException("O destino precisa ser um diretório!");
      }
      destino.mkdirs();
      File[] filhos = origem.listFiles(filtro);
      File atual = null;
      int quantidade = filhos.length;
      for (int i = 0; i < quantidade; i++) {
         atual = filhos[i];
         if (atual.isDirectory()) {
            copiaDiretorio(atual, new File(destino, atual.getName()), filtro);
         } else {
            copiaArquivo(atual, new File(destino, atual.getName()));
         }
      }
   }
}

